package com.softeem.oss_music.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.softeem.oss_music.comm.R;
import com.softeem.oss_music.entity.Admin;
import com.softeem.oss_music.service.AdminService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

@Tag(name = "管理员管理")
@RestController
public class AdminController {
    @Autowired
    private AdminService adminService;
    
    @Operation(summary = "管理员列表", description = "根据提供的页码和数据链条实现分页查询")
    @Parameters({
            @Parameter(name = "page", description = "页码"),
            @Parameter(name = "limit", description = "数据条数")
    })
    @GetMapping("/admin/list")
    public R list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit){
        // 创建分页对象
        IPage<Admin> iPage = new Page<>(page, limit);
        // 调用page方法进行分页查询
        iPage = adminService.page(iPage);
        // 从分页对象中获取数据和总数
        List<Admin> list = iPage.getRecords();
        long count = iPage.getTotal();
        return R.success().setData(list).setCount(count);
    }
    
    @Operation(summary = "管理员详情", description = "根据管理员ID查询详情")
    @Parameters({
            @Parameter(name = "id", description = "管理员ID")
    })
    @GetMapping("/admin/details")
    public R details(Integer id){
        if (id == null) {
            return R.error().setMessage("管理员ID不能为空");
        }
        Admin admin = adminService.getById(id);
        if (admin == null) {
            return R.error().setMessage("管理员不存在");
        }
        return R.success().setData(admin);
    }
    
    @Operation(summary = "添加管理员", description = "根据提供的用户名和密码实现添加")
    @PostMapping("/admin/add")
    public R add(@RequestBody Admin admin){
        // 设置默认值
        if (admin.getCreateTime() == null) {
            admin.setCreateTime(new Timestamp(System.currentTimeMillis()));
        }
        if (admin.getStatus() == null) {
            admin.setStatus(1); // 默认启用
        }
        return adminService.add(admin);
    }

    @Operation(summary = "修改管理员", description = "根据提供的用户名和密码实现修改")
    @PutMapping("/admin/update")
    public R update(@RequestBody Admin admin){
        if (admin.getId() == null) {
            return R.error().setMessage("管理员ID不能为空");
        }
        Admin existingAdmin = adminService.getById(admin.getId());
        if (existingAdmin == null) {
            return R.error().setMessage("管理员不存在");
        }
        // 保留原密码，如果没有提供新密码
        if (admin.getPassword() == null || admin.getPassword().trim().isEmpty()) {
            admin.setPassword(existingAdmin.getPassword());
        }
        boolean result = adminService.updateById(admin);
        return result ? R.success().setMessage("更新成功").setData(admin) : R.error().setMessage("更新失败");
    }
    
    @Operation(summary = "修改密码", description = "修改管理员密码")
    @PostMapping("/admin/updatePassword")
    public R updatePassword(@RequestBody Admin admin){
        if (admin.getId() == null) {
            return R.error().setMessage("管理员ID不能为空");
        }
        if (admin.getPassword() == null || admin.getPassword().trim().isEmpty()) {
            return R.error().setMessage("新密码不能为空");
        }
        Admin existingAdmin = adminService.getById(admin.getId());
        if (existingAdmin == null) {
            return R.error().setMessage("管理员不存在");
        }
        existingAdmin.setPassword(admin.getPassword());
        boolean result = adminService.updateById(existingAdmin);
        return result ? R.success().setMessage("密码修改成功") : R.error().setMessage("密码修改失败");
    }
    
    @Operation(summary = "删除管理员", description = "根据提供的id实现删除")
    @Parameters({
            @Parameter(name = "id", description = "管理员id")
    })
    @DeleteMapping("/admin/delete")
    public R delete(Integer id) {
        if (id == null) {
            return R.error().setMessage("管理员ID不能为空");
        }
        Admin admin = adminService.getById(id);
        if (admin == null) {
            return R.error().setMessage("管理员不存在");
        }
        boolean result = adminService.removeById(id);
        return result ? R.success().setMessage("删除成功") : R.error().setMessage("删除失败");
    }
    
    @Operation(summary = "启用管理员", description = "启用指定ID的管理员")
    @Parameters({
            @Parameter(name = "id", description = "管理员ID")
    })
    @PostMapping("/admin/enable")
    public R enable(Integer id){
        if (id == null) {
            return R.error().setMessage("管理员ID不能为空");
        }
        Admin admin = adminService.getById(id);
        if (admin == null) {
            return R.error().setMessage("管理员不存在");
        }
        admin.setStatus(1);
        boolean result = adminService.updateById(admin);
        return result ? R.success().setMessage("管理员已启用") : R.error().setMessage("启用失败");
    }
    
    @Operation(summary = "禁用管理员", description = "禁用指定ID的管理员")
    @Parameters({
            @Parameter(name = "id", description = "管理员ID")
    })
    @PostMapping("/admin/disable")
    public R disable(Integer id){
        if (id == null) {
            return R.error().setMessage("管理员ID不能为空");
        }
        Admin admin = adminService.getById(id);
        if (admin == null) {
            return R.error().setMessage("管理员不存在");
        }
        admin.setStatus(0);
        boolean result = adminService.updateById(admin);
        return result ? R.success().setMessage("管理员已禁用") : R.error().setMessage("禁用失败");
    }
    
    /**
     查询管理员列表
     */
    @Operation(summary = "查询管理员列表", description = "根据提供的用户名和密码实现查询")
    @Parameters({
            @Parameter(name = "username", description = "用户名"),
            @Parameter(name = "password", description = "密码")
    })
    @GetMapping("/admin/login")
    public R login(String username, String password){
        return adminService.login(username, password);
    }
}